home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr27 / gs26.zip / TYPE1OPS.PS < prev    next >
Text File  |  1993-01-26  |  7KB  |  193 lines

  1. %    Copyright (C) 1992 Aladdin Enterprises.  All rights reserved.
  2. %    Distributed by Free Software Foundation, Inc.
  3. %
  4. % This file is part of Ghostscript.
  5. %
  6. % Ghostscript is distributed in the hope that it will be useful, but
  7. % WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
  8. % to anyone for the consequences of using it or for whether it serves any
  9. % particular purpose or works at all, unless he says so in writing.  Refer
  10. % to the Ghostscript General Public License for full details.
  11. %
  12. % Everyone is granted permission to copy, modify and redistribute
  13. % Ghostscript, but only under the conditions described in the Ghostscript
  14. % General Public License.  A copy of this license is supposed to have been
  15. % given to you along with Ghostscript so you can know your rights and
  16. % responsibilities.  It should be in a file named COPYING.  Among other
  17. % things, the copyright notice and this notice must be preserved on all
  18. % copies.
  19.  
  20. % type1ops.ps
  21. % Define the Type 1 font opcodes for use by Ghostscript utilities.
  22.  
  23. % Define lenIV (the number of initial random bytes in the encoded outlines).
  24. % This should be zero, but we set it to 4 for compatibility with PostScript.
  25.  
  26. /lenIV 4 def
  27.  
  28. % Define the Type 1 opcodes we care about.
  29.  
  30. /Type1encode 25 dict
  31. /c_hstem 1 def   dup /hstem <01> put
  32. /c_vstem 3 def   dup /vstem <03> put
  33. /c_vmoveto 4 def   dup /vmoveto <04> put
  34. /c_rlineto 5 def   dup /rlineto <05> put
  35. /c_hlineto 6 def   dup /hlineto <06> put
  36. /c_vlineto 7 def   dup /vlineto <07> put
  37. /c_rrcurveto 8 def   dup /rrcurveto <08> put
  38. /c_closepath 9 def   dup /closepath <09> put
  39. /c_callsubr 10 def   /s_callsubr <0a> def   dup /callsubr s_callsubr put
  40. /c_return 11 def   dup /return <0b> put
  41. /c_escape 12 def
  42.   /ce_dotsection 0 def   /s_dotsection <0c06> def   dup /dotsection s_dotsection put
  43.   /ce_vstem3 1 def   /s_vstem3 <0c01> def   dup /vstem3 s_vstem3 put
  44.   /ce_hstem3 2 def   /s_hstem3 <0c02> def   dup /hstem3 s_hstem3 put
  45.   /ce_seac 6 def   /s_seac <0c06> def   dup /seac s_seac put
  46.   /ce_sbw 7 def   /s_sbw <0c07> def   dup /sbw s_sbw put
  47.   /ce_div 12 def   /s_div <0c0c> def   dup /div s_div put
  48.   /ce_callothersubr 16 def   /s_callothersubr <0c10> def   dup /callothersubr s_callothersubr put
  49.   /ce_pop 17 def   /s_pop <0c11> def   dup /pop s_pop put
  50.   /ce_setcurrentpoint 33 def   /s_setcurrentpoint <0c21> def   dup /setcurrentpoint s_setcurrentpoint put
  51. /c_hsbw 13 def   /s_hsbw <0d> def   dup /hsbw s_hsbw put
  52. /c_endchar 14 def   /s_endchar <0e> def   dup /endchar s_endchar put
  53. /c_rmoveto 21 def   dup /rmoveto <15> put
  54. /c_hmoveto 22 def   dup /hmoveto <16> put
  55.   /s_setcurrentpoint_hmoveto s_setcurrentpoint <8b16> concatstrings def
  56. /c_vhcurveto 30 def   dup /vhcurveto <1e> put
  57. /c_hvcurveto 31 def   dup /hvcurveto <1f> put
  58. def
  59.  
  60. % Define the encoding of numbers.
  61. /c_num1 32 def
  62. /c_num2 247 def
  63. /c_num3 251 def
  64. /c_num4 255 def
  65. /min_enc_num1 c_num1 c_num2 sub 1 add 2 idiv def
  66. /max_enc_num1 c_num2 c_num1 sub 1 sub 2 idiv def
  67. /min_enc_num2 max_enc_num1 1 add def
  68. /max_enc_num2 min_enc_num2 c_num3 c_num2 sub 256 mul add 1 sub def
  69. /min_enc_num3 max_enc_num2 neg def
  70. /max_enc_num3 min_enc_num2 neg def
  71.  
  72. % ------ CharString encoding ------ %
  73.  
  74. % For these utilities, a CharString is represented by a sequence of
  75. % integers or names, either in an array or on the stack.
  76. % Integers represent themselves; names are CharString operator names.
  77. % A CharString in an array is called a "charproc"; a CharString on
  78. % the stack is called a "charstack", and is delimited by a mark.
  79. % Individual elements are called "chartokens".
  80.  
  81. % Compute the length of a CharString.
  82. /chartoken_length    % chartoken -> length
  83.  { dup type /nametype eq
  84.     { Type1encode exch get length
  85.     }
  86.     { dup dup -107 ge exch 107 le and
  87.        { pop 1
  88.        }
  89.        { dup -1131 ge exch 1131 le and { 2 } { 5 } ifelse
  90.        }
  91.       ifelse
  92.     }
  93.    ifelse
  94.  } bind def
  95. /charproc_length    % charproc -> length
  96.  { 0 exch { chartoken_length add } forall
  97.  } bind def
  98. /charstack_length    % charstack -> charstack length
  99.  { counttomark 0 exch -1 1 { index chartoken_length add } for
  100.  } bind def
  101.  
  102. % Write a CharString to a file.  Normally this will be a NullEncode filter
  103. % writing on a string of the correct length.
  104. /chartoken_write    % file chartoken ->
  105.  { dup type /nametype eq
  106.     { Type1encode exch get writestring
  107.     }
  108.     { dup dup -107 ge exch 107 le and
  109.        { 139 add
  110.        }
  111.        { dup dup -1131 lt exch 1131 gt or
  112.       { 1 index 255 write
  113.         2 copy -24 bitshift 255 and write
  114.         2 copy -16 bitshift 255 and write
  115.         2 copy -8 bitshift 255 and write
  116.         255 and
  117.       }
  118.       { dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add
  119.         2 copy -8 bitshift write 255 and
  120.       }
  121.      ifelse
  122.        }
  123.       ifelse write
  124.     }
  125.    ifelse
  126.  } bind def
  127. /charproc_write        % file charproc ->
  128.  { { 1 index exch chartoken_write } forall pop
  129.  } bind def
  130. /charstack_write    % charstack file ->
  131.  { counttomark 1 sub -1 1 { index 1 index exch chartoken_write } for
  132.    cleartomark
  133.  } bind def
  134.  
  135. % Convert a charproc or charstack to a proper encrypted CharString.
  136. /charproc_string    % charproc -> string
  137.  { mark exch aload pop charstack_string
  138.  } bind def
  139. /charstack_string    % charstack -> string
  140.  { charstack_length lenIV add string
  141.    dup dup length lenIV sub lenIV exch getinterval    % skip lenIV
  142.    /NullEncode filter
  143.    exch 1 index counttomark 1 add 2 roll
  144.    charstack_write closefile
  145. %   4330 exch dup type1encrypt exch pop readonly
  146.  } bind def
  147.  
  148. % ------ CharString decoding ------ %
  149.  
  150. /Type1decode 256 array
  151. dup 0 32 getinterval
  152.   /-0- /hstem /-2- /vstem /vmoveto /rlineto /hlineto /vlineto
  153.   /rrcurveto /closepath /callsubr /return null /hsbw /endchar /-15-
  154.   /-16- /-17- /-18- /-19- /-20- /rmoveto /hmoveto /-23-
  155.   /-24- /-25- /-26- /-27- /-28- /-29- /vhcurveto /hvcurveto
  156. 33 -1 roll astore pop
  157. dup 12
  158.  { dup read pop dup Type1escape exch known
  159.     { Type1escape exch get }
  160.     { =string cvs copystring }
  161.    ifelse exch
  162.  } put
  163. 32 1 246 { 2 copy dup 139 sub put pop } for
  164. dup 247 { dup read pop 108 add exch } put
  165. dup 248 { dup read pop 364 add exch } put
  166. dup 249 { dup read pop 620 add exch } put
  167. dup 250 { dup read pop 876 add exch } put
  168. dup 251 { dup read pop 108 add neg exch } put
  169. dup 252 { dup read pop 364 add neg exch } put
  170. dup 253 { dup read pop 620 add neg exch } put
  171. dup 254 { dup read pop 876 add neg exch } put
  172. dup 255 { 0 4 { 8 bitshift 1 index read pop add } repeat exch } put
  173. def
  174. /Type1escape 9 dict
  175.   dup ce_dotsection /dotsection put
  176.   dup ce_vstem3 /vstem3 put
  177.   dup ce_hstem3 /hstem3 put
  178.   dup ce_seac /seac put
  179.   dup ce_sbw /sbw put
  180.   dup ce_div /div put
  181.   dup ce_callothersubr /callothersubr put
  182.   dup ce_pop /pop put
  183.   dup ce_setcurrentpoint /setcurrentpoint put
  184. def
  185.  
  186. % Decode a CharString (unencrypted).
  187. /charstack_read        % file -> (NO MARK) charstack
  188.  { { dup read not { pop exit } if
  189.      Type1decode exch get
  190.      dup type /arraytype eq { exec } { exch } ifelse
  191.    } loop
  192.  } bind def
  193.